さくらのIoT PlatformをAWSに連携する
ども、大瀧です。 前回のエントリーでは、さくらのIoT Platform α(以下IoT Platform)を利用するためのセットアップと動作確認を試してみました。今回はIoT PlatformのデータをAWSに連携する構成をご紹介します。
AWSのサービス選び
IoT Platformの外部連携機能としては、Outgoing WebhookとWebSocketの2つがありました。Amazon EC2であればWebサーバーでWebhookの受信、WebSocketクライアントでWebSocketサービスにアクセスできますが、ここはひとつAWSのマネージドサービスで対応できるかを考えてみます。今回はOutgoing WebhookでAPI Gatewayをリクエストし、それをAWS IoTに転送する構成を考えてみました。
API Gatewayを利用することで認証周りを柔軟に選択できること、AWS IoTのメッセージ転送機能で他のAWSサービスとのスムーズに連携することを狙ったものです。
AWSの構成
API Gatewayは、ma2shitaさんの以下の記事を参考に、任意のAPIを作成、/
リソースのPOST
メソッドを追加し、統合タイプにAWSサービスプロキシとして「IoT Data」(AWS IoTのデータ送受信用API)を設定します。
IoT Platformが送出するPOSTリクエストは、以下のようにリクエストボディのJSONのmodule
要素にモジュールIDが含まれるので、[URLパスパラメータ]の[マッピング元]にmethod.request.body.module
とし[パス上書き]のパスに含める(今回はパラメータ名module
)ことでデバイスIDごとにAWS IoTのトピックを分けてみました。
{ "payload": { : }, "module": "1234567890ab", "datetime": "2016-06-06T07:53:07.257754759Z", "type": "channels" }
マッピング元に`method.request.body`が指定できるのはAPI Gatewayのドキュメントや管理コンソールに記載が無い非公式な設定なので、今後動作しなくなるかもしれません。
あとは、ドキュメントを参考に以下とします。
- [AWSサブドメイン]は、
aws iot describe-endpoint
コマンドで得られるサブドメインを入力 - [メソッド]は「POST」を選択
- [パス上書き]は
topics/modules/{module}
と入力(topics/
は固定、modules
は任意) - [実行ロール]は
iot:Publish
アクションが付与されたIAMロールを用意し、ARNを入力 - [URL パスパラメータ]には名前
module
、マッピング元method.request.body.module
を追加 - [URL クエリ文字列パラメータ]には名前
qos
、マッピング元'1'
(シングルクオートを含めること)を追加
この設定で任意のステージを設定、デプロイすれば準備OKです。
AWS IoTの設定
上記設定により、API Gatewayで受け取ったリクエストは、AWS IoTのトピックmodules/<モジュールID>
にパブリッシュされます。AWS IoTの管理コンソールのMQTTクライアントを利用し、トピックをSubscribeしましょう。
トピックのタブを開いたままにしておきましょう。もちろん、トピックに対してルールを追加し、Amazon S3などAWSの各サービスにデータを転送することもできます。最近サポートされたAmazon Elasticsearch Serviceを利用するとデータを簡単に可視化できるのでオススメです。
さくらのIoT Platformの設定
最後に、IoT PlatformのOutgoing WebhookサービスにAPI Gatewayのエンドポイントを追加し、モジュールのデータをAPI GatewayにPOSTします。さくらのIoT Platformのコントロールパネルから[サービス追加]をクリックし、[Payload URL]にAPI GatewayのPOSTメソッドのURLを入力、[名前]と[Secret]は適当なものでOKです。[保存する]をクリックして設定完了です。
前回のエントリーのスケッチでモジュールを動作させてみると。。。
モジュールのデータがIoT Platform、API Gateway経由でAWS IoTまで送信されました!
おまけ : API Gatewayの認証設定(未検証)
今回のAPI Gatewayの構成では認証なしのフルオープンになっているため、IoT Platform以外のホストからも自由にデータをアップロードできてしまいます。IoT PlatformのOutgoing WebhookにあるSecret
パラメータが、リクエストヘッダのX-Sakura-Signature
の署名元文字列として利用されていそうです。署名アルゴリズムが公開されれば、以下の記事のようにAPI GatewayのCustom Authorizationによる署名検証を噛ませてIoT Platformからのアクセスのみに限定することができそうです。
まとめ
さくらのIoT Platform αとAWSを連携し、モジュールから送信されるデータをAWS IoTに転送する設定をご紹介しました。手軽に利用できるさくらのIoT PlatformからのデータをAmazon ESに繋いでダッシュボードを見るもよし、S3に蓄積してあとから分析するもよし、AWSでおいしく料理していただければと思います。